/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.anjelin.gui.app;

import com.anjelin.constantes.Constantes;
import com.anjelin.dal.AbstractFacade;
import com.anjelin.dal.persona.PersonaDelegate;
import com.anjelin.dal.persona.PersonaHuellaDelegate;
import com.anjelin.gui.table.model.PersonaTableModel;
import com.anjelin.gui.table.model.RegistrosPersonaTableModel;
import com.anjelin.modelo.Persona;
import com.anjelin.modelo.PersonaHuella;
import com.anjelin.modelo.PersonaHuellaPK;
import com.anjelin.util.DateUtils;
import com.anjelin.util.EnrollmentDialog;
import com.anjelin.util.MaxLengthTextDocument;
import com.anjelin.util.StackTraceUtil;
import com.digitalpersona.onetouch.DPFPFingerIndex;
import com.digitalpersona.onetouch.DPFPGlobal;
import com.digitalpersona.onetouch.DPFPTemplate;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author Admon
 */
public class PersonaJFrame extends javax.swing.JFrame {

    //private static PersonaJFrame _instance;
    
    private Persona personaSeleccionada = null;
    private JLabel idLabel = new JLabel("Id. Persona :");
    private JLabel idCampo = new JLabel();
    private JLabel numeroIdLabel = new JLabel("Número Identificación :");
    private JTextField numeroIdCampo = new JTextField();
    private JLabel nombresLabel = new JLabel("Nombres :");
    private JTextField nombresCampo = new JTextField();
    private JLabel apellidosLabel = new JLabel("Apellidos :");
    private JTextField apellidosCampo = new JTextField();
    private JLabel telefonoLabel = new JLabel("Teléfono :");
    private JTextField telefonoCampo = new JTextField();
    private JLabel direccionLabel = new JLabel("Dirección :");
    private JTextField direccionCampo = new JTextField();
    private JLabel salarioLabel = new JLabel("Salario :");
    private JTextField salarioCampo = new JTextField();    
    private JCheckBox estadoCampo = new JCheckBox("Activo? ", true);
    private JButton botonNuevo = new JButton("Nuevo");
    private JButton botonModificar = new JButton("Modificar");
    private JButton botonEliminar = new JButton("Eliminar");
    private JButton botonGuardar = new JButton("Guardar");
    private JButton botonCancelar = new JButton("Cancelar");
    private JButton enrrolarButton = new JButton("Enrrolar...");
    private EnumMap<DPFPFingerIndex, DPFPTemplate> templates = new EnumMap<DPFPFingerIndex, DPFPTemplate>(DPFPFingerIndex.class);
    private RegistroPersonaPanel regsitroPersonaPanel = new RegistroPersonaPanel(getPersonaSeleccionada());
    



    /**
     * Creates new form PersonaJFrame
     */
    public PersonaJFrame() {
        initComponents();
        PersonaTableModel modelo = new PersonaTableModel();
        personasjTable.setModel(modelo);
        crearTabsPersona();
        activarCampos(false);
        pack();
        setLocationRelativeTo(null);
        
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e);
                Constantes.FRAME_PERSONAS_ACTIVA = true;
            }

            @Override
            public void windowClosed(WindowEvent e) {
                super.windowClosed(e); 
                Constantes.FRAME_PERSONAS_ACTIVA = false;
            }            
        });
        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        personasjTable = new javax.swing.JTable();
        personasTab = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane4 = new javax.swing.JScrollPane();
        outputPersonas = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Registro Datos Persona");

        personasjTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(personasjTable);

        jPanel1.setLayout(new java.awt.GridLayout(1, 0));
        personasTab.addTab("tab1", jPanel1);

        outputPersonas.setEditable(false);
        outputPersonas.setColumns(20);
        outputPersonas.setRows(5);
        jScrollPane4.setViewportView(outputPersonas);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(personasTab, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 742, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane4))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(personasTab, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
//    public static void main(String args[]) {
//        /* Set the Nimbus look and feel */
//        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
//        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
//         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
//         */
//        try {
//            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
//                if ("Nimbus".equals(info.getName())) {
//                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
//                    break;
//                }
//            }
//        } catch (ClassNotFoundException ex) {
//            java.util.logging.Logger.getLogger(PersonaJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (InstantiationException ex) {
//            java.util.logging.Logger.getLogger(PersonaJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (IllegalAccessException ex) {
//            java.util.logging.Logger.getLogger(PersonaJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
//            java.util.logging.Logger.getLogger(PersonaJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
//        }
//        //</editor-fold>
//
//        /* Create and display the form */
//        java.awt.EventQueue.invokeLater(new Runnable() {
//            public void run() {
//                new PersonaJFrame().setVisible(true);
//            }
//        });
//    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JTextArea outputPersonas;
    private javax.swing.JTabbedPane personasTab;
    private javax.swing.JTable personasjTable;
    // End of variables declaration//GEN-END:variables

//    public static PersonaJFrame getInstance(){        
//        if(_instance == null){
//            _instance = new PersonaJFrame();
//        }
//        return _instance;
//    }

    private void crearTabsPersona() {
        try {
            
            personasTab.removeAll();
            personasjTable.getSelectionModel().addListSelectionListener(new RowListener());
            personasjTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            
  
            GridLayout gridLayout = new GridLayout(0,4,10,10);
            jPanel1.setLayout(gridLayout);
            jPanel1.add(numeroIdLabel);
            jPanel1.add(numeroIdCampo);
            jPanel1.add(idLabel);
            jPanel1.add(idCampo);
            jPanel1.add(nombresLabel);
            jPanel1.add(nombresCampo);
            jPanel1.add(apellidosLabel);
            jPanel1.add(apellidosCampo);
            jPanel1.add(telefonoLabel);
            jPanel1.add(telefonoCampo);
            jPanel1.add(direccionLabel);
            jPanel1.add(direccionCampo);
            jPanel1.add(salarioLabel);
            jPanel1.add(salarioCampo);             
            jPanel1.add(estadoCampo);
            jPanel1.add(new JLabel());
            
            JPanel botonera = new JPanel(new GridLayout(0, 6, 5, 5));
            
            enrrolarButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) { 
                    new EnrollmentDialog(PersonaJFrame.this, Integer.parseInt(Constantes.getProperties().getProperty("numero.Maximo.registro.huellas")), null, templates).setVisible(true);
                }

            });            
            botonera.add(botonNuevo);            
            botonera.add(botonModificar);            
            botonera.add(botonEliminar);            
            botonera.add(botonGuardar);
            botonera.add(enrrolarButton);
            botonera.add(botonCancelar); 
            
            //Iconos
            enrrolarButton.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/finger.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            botonCancelar.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/cancel.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            botonNuevo.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/new.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            botonModificar.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/edit.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            botonEliminar.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/delete.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            botonGuardar.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/images/save.png")).getImage().getScaledInstance( Constantes.TAMANO_IMAGEN_WIDTH, Constantes.TAMANO_IMAGEN_HEIGHT,  java.awt.Image.SCALE_SMOOTH )));
            
            
            
            botonCancelar.setVisible(false);
            botonNuevo.setEnabled(true);
            botonModificar.setEnabled(false);
            botonEliminar.setEnabled(false);
            botonGuardar.setEnabled(false);
            numeroIdCampo.setDocument(new MaxLengthTextDocument(20));
            nombresCampo.setDocument(new MaxLengthTextDocument(50));
            apellidosCampo.setDocument(new MaxLengthTextDocument(50));
            telefonoCampo.setDocument(new MaxLengthTextDocument(100));
            direccionCampo.setDocument(new MaxLengthTextDocument(100));

            
          
            ActionListener actionListenerBotones = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    outputPersonas.setText("");
                    Integer comando = Integer.parseInt(actionEvent.getActionCommand());
                    PersonaDelegate personaDelegate = null;
                    switch(comando){
                        case Constantes.COMANDO_NUEVO:
                            activarCampos(true);
                            estadoCampo.setSelected(true);
                            setPersonaSeleccionada(new Persona());
                            cargarDatosPersonaSeleccionada();
                            botonCancelar.setVisible(true);
                            botonNuevo.setEnabled(false);
                            botonModificar.setEnabled(false);
                            botonEliminar.setEnabled(false);
                            botonGuardar.setEnabled(true);
                            personasjTable.setEnabled(false);
                            personasTab.setEnabledAt(1, false);
 
                            outputPersonas.append("INGRESE LOS DATOS DE LA NUEVA PERSONA Y LUEGO OPRIMA GUARDAR. DE LO CONTRARIO CANCELAR! \n");
                            break;
                        case Constantes.COMANDO_CANCELAR:
                            activarCampos(false);
                            setPersonaSeleccionada(new Persona());
                            cargarDatosPersonaSeleccionada();                            
                            botonCancelar.setVisible(false);
                            botonNuevo.setEnabled(true);
                            botonModificar.setEnabled(false);
                            botonEliminar.setEnabled(false);
                            botonGuardar.setEnabled(false);                           
                            personasjTable.setEnabled(true);
                            break;
                        case Constantes.COMANDO_GUARDAR:                            
                            try {
                                personaDelegate = new PersonaDelegate();

                                AbstractFacade.EM.getTransaction().begin();
                                personaDelegate.crear(obtenerNuevosdatosPersona());
                                
                                
                                //templates
                                PersonaHuellaDelegate personaHuellaDelegate = new PersonaHuellaDelegate();
                                if (!templates.isEmpty()) {
                                    for (Map.Entry<DPFPFingerIndex, DPFPTemplate> entry : templates.entrySet()) {
                                        DPFPFingerIndex dPFPFingerIndex = entry.getKey();
                                        DPFPTemplate dPFPTemplate = entry.getValue();
                                        PersonaHuellaPK pk = new PersonaHuellaPK(getPersonaSeleccionada().getId(),(int) dPFPFingerIndex.toBit());
                                        System.out.println("Creando ... " + pk);
                                        PersonaHuella personaHuella = new PersonaHuella(pk, dPFPTemplate.serialize());
                                        personaHuellaDelegate.crear(personaHuella);                                     
                                    }
                                }
                                //Fin template
                                
                                AbstractFacade.EM.getTransaction().commit();                               
                                Integer idPersona = getPersonaSeleccionada().getId();
                                outputPersonas.append("PERSONA CREADA CON  EXITO!! (ID:"+idPersona+")");
                                AbstractFacade.EM.refresh(getPersonaSeleccionada());
                                ((PersonaTableModel)personasjTable.getModel()).getPersonas().add(getPersonaSeleccionada());
                                //((PersonaTableModel)personasjTable.getModel()).getPersonas().add(personaDelegate.buscar(idPersona));
                                personasjTable.updateUI();
                                

                                setPersonaSeleccionada(new Persona());
                                cargarDatosPersonaSeleccionada();
                                botonCancelar.setVisible(false);
                                botonNuevo.setEnabled(true);
                                botonModificar.setEnabled(false);
                                botonEliminar.setEnabled(false);
                                botonGuardar.setEnabled(false);                           
                                personasjTable.setEnabled(true);
                                activarCampos(false);
                                
                                
                            } catch (Exception e) {
                                if(personaDelegate != null && AbstractFacade.EM.getTransaction().isActive()){                                    
                                    AbstractFacade.EM.getTransaction().rollback();
                                }
                                outputPersonas.append("ERROR GUARDANDO LA NUEVA PERSONA\n");
                                outputPersonas.append(StackTraceUtil.getStackTrace(e));
                            }
                            
                            break;
                        case Constantes.COMANDO_MODIFICAR:
                            try {
                                personaDelegate = new PersonaDelegate();
                                AbstractFacade.EM.getTransaction().begin();
                                PersonaHuellaDelegate personaHuellaDelegate = new PersonaHuellaDelegate();
                                personaDelegate.modificar(obtenerNuevosdatosPersona());
                                AbstractFacade.EM.flush();
                                
                                //Se eliminan las que tienia inicialmente en la BD
                                if (getPersonaSeleccionada().getPersonaHuellaList() != null && !getPersonaSeleccionada().getPersonaHuellaList().isEmpty()) {                                                                        
                                    for (PersonaHuella huella : getPersonaSeleccionada().getPersonaHuellaList()) {
                                        personaHuellaDelegate.eliminar(huella);
                                    }
                                    AbstractFacade.EM.flush();
                                }  
                               
                                //Se registran las nuevas huellas
                                if (!templates.isEmpty()) {

                                    for (Map.Entry<DPFPFingerIndex, DPFPTemplate> entry : templates.entrySet()) {
                                        DPFPFingerIndex dPFPFingerIndex = entry.getKey();
                                        DPFPTemplate dPFPTemplate = entry.getValue();
                                        PersonaHuellaPK pk = new PersonaHuellaPK(getPersonaSeleccionada().getId(), (int) dPFPFingerIndex.toBit());
                                        PersonaHuella personaHuella = new PersonaHuella(pk, dPFPTemplate.serialize());
                                        personaHuellaDelegate.crear(personaHuella);
                                    }
                                }
                                
                                AbstractFacade.EM.getTransaction().commit();
                                
                                outputPersonas.append("PERSONA MODIFICADA CON  EXITO!! ");
                                
                                //Se refresca la entidad con los nuevos cambios BD
                                AbstractFacade.EM.refresh(getPersonaSeleccionada());
                                int indicePersona = ((PersonaTableModel)personasjTable.getModel()).getPersonas().indexOf(getPersonaSeleccionada());
                                ((PersonaTableModel)personasjTable.getModel()).getPersonas().remove(getPersonaSeleccionada());
                                ((PersonaTableModel)personasjTable.getModel()).getPersonas().add(indicePersona, getPersonaSeleccionada());
                                personasjTable.updateUI();
                                setPersonaSeleccionada(new Persona());
                                cargarDatosPersonaSeleccionada();
                                botonCancelar.setVisible(false);
                                botonNuevo.setEnabled(true);
                                botonModificar.setEnabled(false);
                                botonEliminar.setEnabled(false);
                                botonGuardar.setEnabled(false);                           
                                personasjTable.setEnabled(true);
                                activarCampos(false);
                                
                            } catch (Exception e) {
                                if (personaDelegate != null && AbstractFacade.EM.getTransaction().isActive()) {
                                    AbstractFacade.EM.getTransaction().rollback();
                                }
                                outputPersonas.append("ERROR AL MODIFICAR LA PERSONA\n");
                                outputPersonas.append(StackTraceUtil.getStackTrace(e));
                            }
                            
                            break;
                       case Constantes.COMANDO_ELIMINAR:
                           try {

                               if (JOptionPane.showConfirmDialog(null, "<html>Confirma la eliminación de la persona <b>" + getPersonaSeleccionada().getNombres() + "</b>?</html>", "CONFIRMACION", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                                   personaDelegate = new PersonaDelegate();
                                   AbstractFacade.EM.getTransaction().begin();
                                   personaDelegate.eliminar(getPersonaSeleccionada());
                                   AbstractFacade.EM.getTransaction().commit();
                                   outputPersonas.append("PERSONA ELIMINADA CON  EXITO!! ");

                                   ((PersonaTableModel) personasjTable.getModel()).getPersonas().remove(getPersonaSeleccionada());

                                   personasjTable.updateUI();
                                   setPersonaSeleccionada(new Persona());
                                   cargarDatosPersonaSeleccionada();
                                   botonCancelar.setVisible(false);
                                   botonNuevo.setEnabled(true);
                                   botonModificar.setEnabled(false);
                                   botonEliminar.setEnabled(false);
                                   botonGuardar.setEnabled(false);
                                   personasjTable.setEnabled(true);
                                   activarCampos(false);

                               }




                           } catch (Exception e) {
                               if (personaDelegate != null && AbstractFacade.EM.getTransaction().isActive()) {
                                   AbstractFacade.EM.getTransaction().rollback();
                               }
                               outputPersonas.append("ERROR AL ELIMINAR LA PERSONA\n");
                               outputPersonas.append(StackTraceUtil.getStackTrace(e));
                           }
                            
                            break;                            
                        default:
                            break; 
                    };                    
                    
                }
            };            
            botonNuevo.setActionCommand(String.valueOf(Constantes.COMANDO_NUEVO));
            botonNuevo.addActionListener(actionListenerBotones);
            botonModificar.setActionCommand(String.valueOf(Constantes.COMANDO_MODIFICAR));
            botonModificar.addActionListener(actionListenerBotones);
            botonEliminar.setActionCommand(String.valueOf(Constantes.COMANDO_ELIMINAR));
            botonEliminar.addActionListener(actionListenerBotones);
            botonGuardar.setActionCommand(String.valueOf(Constantes.COMANDO_GUARDAR));
            botonGuardar.addActionListener(actionListenerBotones);
            botonCancelar.setActionCommand(String.valueOf(Constantes.COMANDO_CANCELAR));
            botonCancelar.addActionListener(actionListenerBotones);
                    
            
            JPanel tabDatos = new JPanel(new BorderLayout());
            tabDatos.add(jPanel1, BorderLayout.CENTER);
            tabDatos.add(botonera, BorderLayout.SOUTH);
            
            personasTab.addTab("Datos Generales Persona", tabDatos);
            personasTab.addTab("Registros Persona", regsitroPersonaPanel);
            personasTab.setEnabledAt(1, false);
            
            cargarDatosPersonaSeleccionada();   
    
        } catch (Exception e) {
            outputPersonas.append(StackTraceUtil.getStackTrace(e)+"\n");
        }

    }
    
  

    private void cargarDatosPersonaSeleccionada() {
       
        idCampo.setText(getPersonaSeleccionada().getId() == null ? "" : "<html><H4>" + getPersonaSeleccionada().getId().toString() + "</H4></html>");
        numeroIdCampo.setText(getPersonaSeleccionada().getNumeroIdentificacion());
        nombresCampo.setText(getPersonaSeleccionada().getNombres());
        apellidosCampo.setText(getPersonaSeleccionada().getApellidos());
        telefonoCampo.setText(getPersonaSeleccionada().getTelefono());
        direccionCampo.setText(getPersonaSeleccionada().getDireccion());
        salarioCampo.setText(String.valueOf(getPersonaSeleccionada().getSalario()));
        estadoCampo.setSelected(getPersonaSeleccionada().getEstado());


        this.templates.clear();
        List<PersonaHuella> listaHuellas = getPersonaSeleccionada().getPersonaHuellaList();
        if (getPersonaSeleccionada().getId() != null && listaHuellas != null && !listaHuellas.isEmpty()) {
            //Si se ha seleccionado una persona y tiene huellas registradas
            for (PersonaHuella personaHuella : listaHuellas) {  
                DPFPTemplate template = DPFPGlobal.getTemplateFactory().createTemplate();
                template.deserialize(personaHuella.getTemplateHuella());
                this.templates.put(com.anjelin.util.Utilities.enumFromBit(personaHuella.getDedoDigitalpersona().getFingerindex()), template);                
            }
        }      
        
    }

    
    private Persona obtenerNuevosdatosPersona() {
        getPersonaSeleccionada().setNombres(nombresCampo.getText());
        getPersonaSeleccionada().setApellidos(apellidosCampo.getText());
        getPersonaSeleccionada().setTelefono(telefonoCampo.getText());
        getPersonaSeleccionada().setDireccion(direccionCampo.getText());
        getPersonaSeleccionada().setNumeroIdentificacion(numeroIdCampo.getText());
        try {
            getPersonaSeleccionada().setSalario(Double.parseDouble(salarioCampo.getText()));
        } catch (Exception e) {
           getPersonaSeleccionada().setSalario(0);
        }
        getPersonaSeleccionada().setEstado(estadoCampo.isSelected());
        return getPersonaSeleccionada();
    }

    private void activarCampos(boolean activar) {
        idCampo.setEnabled(activar);
        numeroIdCampo.setEnabled(activar);
        nombresCampo.setEnabled(activar);
        apellidosCampo.setEnabled(activar);
        telefonoCampo.setEnabled(activar);
        direccionCampo.setEnabled(activar);
        salarioCampo.setEnabled(activar);
        estadoCampo.setEnabled(activar);        
        personasTab.setEnabledAt(1, activar);
    }


    
    
    private class RowListener implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent event) {
            if (event.getValueIsAdjusting()) {
                return;
            }
            botonCancelar.setVisible(true);
            botonNuevo.setEnabled(false);
            botonModificar.setEnabled(true);
            botonEliminar.setEnabled(true);
            botonGuardar.setEnabled(false);
            seleccionarPersona();
            //CARGA REGISTROS PERSONA SELECCIONADA DEL MES ACTUAL
            regsitroPersonaPanel.setPersonaSeleccionada(getPersonaSeleccionada());
            regsitroPersonaPanel.getTablaRegistrosPersona().removeAll();
            RegistrosPersonaTableModel registrosPersonaTableModel = regsitroPersonaPanel.getRegistrosPersonaTableModel();
            Date fechaHoy = new Date(System.currentTimeMillis());
            registrosPersonaTableModel.cargarRegistrosPersonaPorRango(personaSeleccionada, DateUtils.getFirstDay(fechaHoy, true), DateUtils.getLastDay(fechaHoy, true));
            regsitroPersonaPanel.getTablaRegistrosPersona().setModel(registrosPersonaTableModel);
            regsitroPersonaPanel.updateUI();
            activarCampos(true);
            //pintamos
            pack();
        }
    }
    
    private void seleccionarPersona() {

        try {
            for (int c : personasjTable.getSelectedRows()) {
                PersonaTableModel modelo = (PersonaTableModel) personasjTable.getModel();
                setPersonaSeleccionada(modelo.getPersona(c));
            }
            cargarDatosPersonaSeleccionada();
        } catch (Exception e) {
            outputPersonas.append(StackTraceUtil.getStackTrace(e)+"\n");
        }


    }
    
    public Persona getPersonaSeleccionada() {
        if(this.personaSeleccionada == null){
            this.personaSeleccionada = new Persona();
        }
        return personaSeleccionada;
    }

    public void setPersonaSeleccionada(Persona personaSeleccionada) {
        this.personaSeleccionada = personaSeleccionada;
    }    
}
